/**
 * @file bsp_usb.c
 * @brief USB驱动实现
 * @author TuxMonkey (nqx2004@gmail.com)
 * @version 1.0
 * @date 2025-07-08
 * 
 * @copyright Copyright (c) 2025  DLMU-C.ONE
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2025-07-08 <td>1.0     <td>TuxMonkey     <td>内容
 * </table>
 */

#include "bsp_usb.h"
#include "bsp_log.h"
#include "bsp_dwt.h"

static uint8_t *bsp_usb_rx_buffer; // 接收到的数据会被放在这里,buffer size为2048
// 注意usb单个数据包(Full speed模式下)最大为64byte,超出可能会出现丢包情况

/**
 * @brief USB初始化函数
 * 
 * @param usb_conf USB初始化配置结构体,包含发送和接收回调函数
 * @return uint8_t* 返回接收数据的指针,用于后续数据处理
 * 
 * @note 该函数会在USB设备初始化时调用,并设置接收回调函数
 */

uint8_t *USBInit(USB_Init_Config_s usb_conf)
{
    // usb的软件复位(模拟拔插)在usbd_conf.c中的HAL_PCD_MspInit()中
    bsp_usb_rx_buffer = CDCInitRxbufferNcallback(usb_conf.tx_cbk, usb_conf.rx_cbk); // 获取接收数据指针
    // usb的接收回调函数会在这里被设置,并将数据保存在bsp_usb_rx_buffer中
    LOGINFO("USB init success");
    return bsp_usb_rx_buffer;
}

/**
 * @brief 通过USB发送数据
 * @param  buffer           发送数据缓冲区
 * @param  len              发送数据长度
 */

void USBTransmit(uint8_t *buffer, uint16_t len)
{
    CDC_Transmit_FS(buffer, len); // 发送
}
